#include <memory>

using namespace std;

int main()
{
    auto p = make_shared<int>(42); // p 指向的对象只有 p 一个引用者
    auto q(p); // p 和 q 指向相同对象，此对象有两个引用者

    auto r = make_shared<int>(42); // r 指向的 int 只有一个引用者
    // 给 r 赋值，令它指向另一个地址
    // 递增 q 指向的对象的引用计数
    // 递减 r 原来指向的对象的引用计数，减到 0 会自动释放
    r = q;
}

struct Foo {

};

// factory 返回一个 shared_ptr，指向一个动态分配的对象
template <typename T> shared_ptr<Foo> factory(T arg)
{
    // 恰当地处理 arg
    // shared_ptr 负责释放内存
    return make_shared<Foo>(arg);
}

template <typename T> void use_factory1(T arg)
{
    shared_ptr<Foo> p = factory(arg);
    // 使用 p
} // p 离开了作用域，它指向的内存会被自动释放掉

template <typename T> void use_factory2(T arg)
{
    shared_ptr<Foo> p = factory(arg);
    // 使用 p
    return p; // 当我们返回 p 时，引用计数进行了递增操作
} // p 离开了作用域，但它指向的内存不会被释放掉